package bizcode

import (
	"fmt"
)

// BizCode 业务状态码结构体
type BizCode struct {
	Code    int    `json:"code"`    // 状态码值
	Message string `json:"message"` // 状态信息
}

// 实现error接口, 使BizCode可以作为error返回
func (c *BizCode) Error() string {
	return fmt.Sprintf("状态码: %d, 信息: %s", c.Code, c.Message)
}

// StatusCode 获取状态码值
func (c *BizCode) StatusCode() int {
	return c.Code
}

// String 获取状态信息
func (c *BizCode) String() string {
	return c.Message
}

// NewCode 创建自定义业务状态码
func NewCode(value int, message string) *BizCode {
	return &BizCode{
		Code:    value,
		Message: message,
	}
}

// 状态码结构说明：6位数字
// 格式: MMSSEE
// - MM: 模块编码 (10-99)
// - SS: 子模块或场景编码 (00-99)
// - EE: 具体状态编码 (00-99)
var (
	// 成功
	Success = NewCode(0, "成功")

	// =================================================
	// 通用状态码: 10xxxx
	// =================================================

	// 服务器错误 100xxx
	// 服务器内部错误
	ServerError = NewCode(100001, "服务器内部错误")
	// 请求过于频繁
	TooManyRequests = NewCode(100002, "请求过于频繁")
	// 数据库操作错误
	DatabaseError = NewCode(100003, "数据库操作错误")
	// 缓存服务错误
	CacheError = NewCode(100004, "缓存服务错误")
	// 系统配置错误
	ConfigError = NewCode(100005, "系统配置错误")
	// 依赖服务不可用
	DependencyServiceDown = NewCode(100006, "依赖服务不可用")

	// 请求参数错误 101xxx
	// 无效的请求参数
	InvalidParams = NewCode(101001, "无效的请求参数")
	// 缺少必要参数
	MissingRequiredParam = NewCode(101002, "缺少必要参数")
	// 无效的JSON格式
	InvalidJSONFormat = NewCode(101003, "无效的JSON格式")
	// 无效的文件格式
	InvalidFileFormat = NewCode(101004, "无效的文件格式")
	// 文件大小超出限制
	FileTooLarge = NewCode(101005, "文件大小超出限制")

	// 通用业务错误 102xxx
	// 资源不存在
	ResourceNotFound = NewCode(102001, "资源不存在")
	// 资源已存在
	ResourceAlreadyExists = NewCode(102002, "资源已存在")
	// 操作失败
	OperationFailed = NewCode(102003, "操作失败")
	// 操作超时
	Timeout = NewCode(102004, "操作超时")
	// 服务暂时不可用
	ServiceUnavailable = NewCode(102005, "服务暂时不可用")
)

var (
	// =================================================
	// 用户认证相关状态码: 20xxxx
	// =================================================

	// 登录注册错误 200xxx
	// 用户不存在
	UserNotFound = NewCode(200001, "用户不存在")
	// 用户名或密码不正确
	UsernameOrPasswordIncorrect = NewCode(200002, "用户名或密码不正确")
	// 用户已存在
	UserAlreadyExists = NewCode(200003, "用户已存在")
	// 邮箱已被注册
	EmailAlreadyRegistered = NewCode(200004, "邮箱已被注册")
	// 密码强度不足
	WeakPassword = NewCode(200005, "密码强度不足")
	// 密码加密失败
	PasswordEncryptionFailed = NewCode(200006, "密码加密失败")

	// 令牌相关错误 201xxx
	// 无效的令牌
	TokenInvalid = NewCode(201001, "无效的令牌")
	// 令牌已过期
	TokenExpired = NewCode(201002, "令牌已过期")
	// 缺少令牌
	TokenMissing = NewCode(201003, "缺少令牌")
	// 无效的刷新令牌
	RefreshTokenInvalid = NewCode(201004, "无效的刷新令牌")
	// 刷新令牌已过期
	RefreshTokenExpired = NewCode(201005, "刷新令牌已过期")
	// 创建访问令牌失败
	CreateAccessTokenFailed = NewCode(201006, "创建访问令牌失败")
	// 创建刷新令牌失败
	CreateRefreshTokenFailed = NewCode(201007, "创建刷新令牌失败")

	// 权限相关错误 202xxx
	// 未授权的访问
	Unauthorized = NewCode(202001, "未授权的访问")
	// 禁止访问
	Forbidden = NewCode(202002, "禁止访问")
	// 登录尝试次数过多
	TooManyLoginAttempts = NewCode(202003, "登录尝试次数过多")
	// 账号已锁定
	AccountLocked = NewCode(202004, "账号已锁定")
	// 需要验证码
	NeedCaptcha = NewCode(202005, "需要验证码")
)

var (
	// =================================================
	// 表单相关状态码: 30xxxx
	// =================================================

	// 表单基础错误 300xxx
	// 表单不存在
	FormNotFound = NewCode(300001, "表单不存在")
	// 表单已存在
	FormAlreadyExists = NewCode(300002, "表单已存在")
	// 表单验证失败
	FormValidationError = NewCode(300003, "表单验证失败")
	// 创建表单失败
	FormCreateFailed = NewCode(300004, "创建表单失败")
	// 更新表单失败
	FormUpdateFailed = NewCode(300005, "更新表单失败")
	// 删除表单失败
	FormDeleteFailed = NewCode(300006, "删除表单失败")

	// 表单提交错误 301xxx
	// 表单提交失败
	FormSubmitFailed = NewCode(301001, "表单提交失败")
	// 表单回复不存在
	FormResponseNotFound = NewCode(301002, "表单回复不存在")
	// 已达表单回复上限
	FormResponseLimit = NewCode(301003, "已达表单回复上限")
	// 表单已关闭
	FormClosed = NewCode(301004, "表单已关闭")
	// 表单未发布
	FormNotPublished = NewCode(301005, "表单未发布")
)

var (
	// =================================================
	// 任务相关状态码: 40xxxx
	// =================================================

	// 任务基础错误 400xxx
	// 任务不存在
	TaskNotFound = NewCode(400001, "任务不存在")
	// 创建任务失败
	TaskCreateFailed = NewCode(400002, "创建任务失败")
	// 更新任务失败
	TaskUpdateFailed = NewCode(400003, "更新任务失败")
	// 删除任务失败
	TaskDeleteFailed = NewCode(400004, "删除任务失败")
	// 任务已存在
	TaskAlreadyExists = NewCode(400005, "任务已存在")
	// 获取任务失败
	TaskFetchFailed = NewCode(400006, "获取任务失败")

	// 任务状态错误 401xxx
	// 任务已完成
	TaskAlreadyCompleted = NewCode(401001, "任务已完成")
	// 任务已取消
	TaskAlreadyCancelled = NewCode(401002, "任务已取消")
	// 任务进行中
	TaskInProgress = NewCode(401003, "任务进行中")
)

var (
	// =================================================
	// 用户档案相关状态码: 50xxxx
	// =================================================

	// 用户档案错误 500xxx
	// 用户档案不存在
	ProfileNotFound = NewCode(500001, "用户档案不存在")
	// 更新用户档案失败
	ProfileUpdateFailed = NewCode(500002, "更新用户档案失败")
	// 创建用户档案失败
	ProfileCreateFailed = NewCode(500003, "创建用户档案失败")
	// 获取用户档案失败
	GetProfileFailed = NewCode(500004, "获取用户档案失败")
)

var (
	// =================================================
	// 文件上传相关状态码: 60xxxx
	// =================================================

	// 文件上传失败
	FileUploadFailed = NewCode(600001, "文件上传失败")
	// 文件下载失败
	FileDownloadFailed = NewCode(600002, "文件下载失败")
	// 文件不存在
	FileNotFound = NewCode(600003, "文件不存在")
	// 无效的文件类型
	InvalidFileType = NewCode(600004, "无效的文件类型")
	// 文件大小超出限制
	FileSizeLimitExceed = NewCode(600005, "文件大小超出限制")
	// 存储空间不足
	StorageQuotaExceed = NewCode(600006, "存储空间不足")

	// =================================================
	// 题目相关状态码: 70xxxx
	// =================================================

	// 题目基础错误 700xxx
	// 请求中缺少有效的题目数据
	MissingQuestionData = NewCode(700001, "请求中缺少有效的题目数据")
)
